package br.sddp.dao;

import javax.persistence.EntityManager;
import javax.validation.ConstraintViolationException;

import br.sddp.util.JPAUtil;
import br.sddp.util.TratadorExceptions;

/**
 * Classe que modela o DAO generico.
 * 
 * @author v0rtex
 *
 */
public abstract class GenericDAO {

	protected EntityManager em;

	/**
	 * Metodo responsavel por persistir um objeto.
	 * 
	 * @param objeto
	 * @return
	 */
	public <T> boolean cadastrar(T objeto) {

		boolean r = false;
		em = new JPAUtil().getEntityManager();
		
		try {
			em.getTransaction().begin();
			em.persist(objeto);
			em.getTransaction().commit();
			r = true;
		}
		
		catch (ConstraintViolationException h) {
			TratadorExceptions.tratarConstraintViolationException(h);
			em.getTransaction().rollback();
		}
		
		catch (Exception e) {
			em.getTransaction().rollback();
			TratadorExceptions.tratarExceptionsGerais(e);
		}
		
		finally {
			em.close();
		}
		
		return r;
	}

	/**
	 * Metodo que efetua a atualizacao da Duvida.
	 * @param d
	 * @return true = sucesso, false = erro.
	 * 
	 */
	public <T> boolean atualizar(T objeto) {
		em = new JPAUtil().getEntityManager();
		boolean r = false;
		
		try {
			em.getTransaction().begin();
			em.merge(objeto);
			em.getTransaction().commit();
			r = true;
			
		}
		catch (Exception e) {
			TratadorExceptions.tratarExceptionsGerais(e);
			em.getTransaction().rollback();
		}
		finally {
			em.close();
		}
		
		return r;
	}

	public EntityManager getEm() {
		return em;
	}

	public void setEm(EntityManager em) {
		this.em = em;
	}
}
